package org.zhu.optional;

import java.util.Optional;
import java.util.function.Function;

/**
 * Created by zhu yingzhi on 2017/8/29.
 * Optional 本质上就是一个容器 它实现了对容器中的对象进行操作的某些封装
 * Optional 操作处理类
 * Optional 的方法中基本都是内部调用  isPresent() 判断, 真时处理值, 假时什么也不做.
 */
public class Client {
    public static void main(String[] args) throws Exception {
        //Optional.of()
        Optional<String>
                name = Optional.of("Sanaulla");

        Optional<String>
                empty = Optional.ofNullable(null);

        //如果有值则执行 Customer函数式接口
        name.ifPresent((valu) -> {
            System.out.println("heheda " + valu);
        });

        //得到吧变量放入Optional容器中 并且通过map方法使用function函数式接口对容器中的值进行修改，返回容器对象
        String x = "heheda1";
        System.out.println(Optional.ofNullable(x).map((s) -> {
            return s.toUpperCase();
        }));

        // 如果Optional中无值则可以通过orElse返回默认值
        x = null;
        System.out.println(Optional.ofNullable(x).orElse("default value"));

        //如果Optional中无值则可以通过orElse返回由 Supplier函数式接口的 lamada表达式构建的默认值
        x = null;
        System.out.println(Optional.ofNullable(x).orElseGet(() -> {
            String d = "default";
            String v = "value";
            return d + v;
        }));

        //和map类似但是flatMap 返回的是Optional flatMapflatMap(Function<? super T, Optional<U>> mapper)
        x = "ppp";
        System.out.println(Optional.ofNullable(x).flatMap((s) -> Optional.of("asd")).get());

        //filter方法检查给定的Option值是否满足某些条件。如果满足则返回同一个Option实例，否则返回空Optional。
        System.out.println(Optional.ofNullable(x).filter((p) ->
                p.equals("ppp")));

        x = null;
        System.out.println(Optional.ofNullable(x).filter((p) ->
                p.equals("ppp")));


//        x="heheda";
//        System.out.println(Optional.ofNullable(x).map((s) -> {int p = 1/0;return s.toUpperCase();}));
        //如果map方法执行过程中Optional容器为空，则直接返回空容器，不会进行Lamada函数执行，并且也会直接被orElseThrow抛出异常，但不会被系统异常捕获
        //可看源码
        //orElseThrow 会抛出Lamada表达式的异常 也会抛出方法的空值异常
        x = null;
        System.out.println(Optional.ofNullable(x).map((s) -> {
            int p = 1 / 0;
            return s.toUpperCase();
        }));
        System.out.println(Optional.ofNullable(x).map((s) -> "asdass").orElseThrow(() ->
                new Exception("正确的异常2")));


    }

    private static String getName(String name) {
        return name + " 123";
    }
}
